package org.example.translation;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.Map;

/**
 * 翻译责任链
 * 翻译厂商的父类
 */
public abstract class LangSupportHandler implements TranslationAble{

    //下一个厂商
    protected LangSupportHandler next;
    //厂商是否进行接口限流
    protected TranslationApiType translationApiType = TranslationApiType.Interval;
    //token或ak、sk属性获取对象
    protected final PropValueSupplier propValueSupplier;
    //最近一次的请求时间
    private long time = System.currentTimeMillis();

    /**
     * 设置下一个厂商
     * @param next 厂商
     * @return this
     */
    public LangSupportHandler setNext(LangSupportHandler next) {
        this.next = next;
        return this;
    }

    public LangSupportHandler(PropValueSupplier propValueSupplier) {
        this.propValueSupplier = propValueSupplier;
    }

    /**
     * 判断自己是否有能力进行翻译，自己可以翻译就返回自己，不能就找下一个厂商
     * @param supportRequest 翻译目标国家
     * @return 找到的厂商
     */
    public LangSupportHandler process(@NotNull LangSupportRequest supportRequest){
        String targetCountry = getSupportLang(supportRequest.getTargetCountry());
        if (targetCountry != null){
            return this;
        }else {
            if (next == null){
                return null;
            }else {
                return next.process(supportRequest);
            }
        }
    }

    /**
     * 实际翻译方法
     * @param postBean 等待翻译数据
     * @return 翻译数据
     */
    public TranslationResponseBean translation(TranslationPostBean postBean){
        time = System.currentTimeMillis();
        return requestTranslation(postBean);
    }

    /**
     * 翻译方法，根据厂商区别
     * @param postBean 翻译数据
     * @return 翻译结果
     */
    public abstract TranslationResponseBean requestTranslation(TranslationPostBean postBean);

    /**
     * 获取是否支持厂商
     * 很多厂商不需要进行处理。比如 zh 转 en。网络请求传递的也是 from：zh     to：en
     * 部分厂商特殊处理。比如 zh 请求时填入的参数却是 zh-Hans
     * @param androidIso2 国家码
     * @return 请求的国家码
     */
    protected abstract String getSupportLang(String androidIso2);
}
